package com.mjf.datatype;

//--一维数组

/**
 * 数组本身是引用数据类型，而数组中的元素可以是任何数据类型，包括基本数据类型和引用数据类型。
 * 创建数组对象会在内存中开辟一整块连续的空间，而数组名中引用的是这块连续空间的首地址。
 * 数组的长度一旦确定，就不能修改。
 * 数组是引用类型，它的元素相当于类的成员变量，因此数组一经分配空间，其中的每个元素也被按照成员变量同样的方式被隐式初始化。
 */

public class ArrayUse1 {

    public static void main(String[] args) {

        //--[]在数据类型（int）后面或者标识符（arr）后面都可以
        int[] arr = new int[]{1, 2, 3, 4, 5};
        System.out.println(arr.length);

        //--定义数组的第一种方式（静态初始化）
        int[] arr1 = new int[]{1, 2, 3, 4, 5};
        //--定义数组的第二种方式（静态初始化）
        int[] arr3 = {1, 3, 5, 7, 9};
        //--定义数组的第三种方式（动态初始化）
        /*
        对于引用数据类型（比如String）而言，默认初始化值为null
        对于基本数据类型而言，默认初始化值各有不同
        */
        String[] arr2 = new String[5];
        arr2[0] = "Hello";
        arr2[3] = "NiHao";

        //--遍历数组
        for (int i = 0; i < arr1.length; i++) {
            System.out.println(String.format("数组1的第%d个元素", i) + arr1[i]);
            System.out.println(String.format("数组2的第%d个元素", i) + arr2[i]);
            System.out.println(String.format("数组3的第%d个元素", i) + arr3[i]);
            System.out.println("----------------------");
        }

        //--数组中常用的算法
        //--二分法查找：要求此数组必须是有序的。
        int[] arr4 = new int[]{-99, -54, -2, 0, 2, 33, 43, 256, 999};
        boolean isFlag = true;
        int number = 256;
        int head = 0;   // 首索引位置
        int end = arr4.length - 1;  // 尾索引位置
        while (head <= end) {
            int middle = (head + end) / 2;
            if (arr4[middle] == number) {
                System.out.println("找到指定的元素，索引为：" + middle);
                isFlag = false;
                break;
            } else if (arr4[middle] > number) {
                end = middle - 1;
            } else {  // arr4[middle] < number
                head = middle + 1;
            }
        }

        if (isFlag) {
            System.out.println("未找打指定的元素");
        }


    }
}
